home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C++ / Applications / Nuntius 1.2 / src / Nuntius / UThread.a < prev    next >
Encoding:
Text File  |  1994-03-16  |  3.9 KB  |  177 lines  |  [TEXT/MPS ]

  1. ; Copyright © 1992 Peter Speck, speck@dat.ruc.dk. All rights reserved.
  2. ; UThread.a
  3.  
  4. ; extern "C" MySwapStacks(Handle fromStackH, Handle toStackH);
  5.  
  6.     Include    'Types.a'
  7.     Include    'Memory.a'
  8.     Case    On
  9.     Seg        'MyThread'
  10.     
  11. CurStackBase       EQU     $908    
  12.  
  13. ; Layout of StackHandle:
  14. kAllocSize            Equ         0; Alloc size of Handle
  15. kStartAddr            Equ         4; start address of saved stack
  16. kSize                Equ         8; Size of saved stack
  17. kSP                    Equ        12; Saved SP
  18. kDataOffset            Equ        16; StackData
  19.  
  20.  
  21. MySwapStacks PROC    EXPORT
  22. ; showup for MacsBug
  23.     link    a6, #0
  24.     unlk    a6
  25.     Import    gFromStackH:Data
  26.     Import    gToStackH:Data
  27.     Import    PanicExitToShell__FPCc:Code
  28.  
  29.     move.l    4(a7), gFromStackH(A5)
  30.     move.l    8(a7), gToStackH(A5)
  31.     
  32.     ; save registers
  33.     movem.l    d0-d7/a0-a6, -(a7)
  34.     
  35. ; save swap-out stack
  36.     tst.l    gFromStackH(A5)
  37.     beq.s    MySwapStacks_SwapIn            ; skip if no from handle
  38.     move.l    CurStackBase, d7
  39.     move.l    a7,d5                        ; round SP (mod 16) into D5
  40.     move.l    #15, d0
  41.     not.l    d0                            ; clear to mod 16
  42.     and.l    d0, d5
  43.     sub.l    d5,d7                        ; d7 = stack size = (CurStackBase - D5)
  44.     move.l    gFromStackH(A5), a4
  45.     move.l    (a4), a4
  46.     move.l    d7, d6                        ; add a little to size for safety
  47.     add.l    #1024, d6
  48.     cmp.l    kAllocSize(a4), d6
  49.     blt.s    NoGrowNeeded
  50.     move.l    gFromStackH(A5), a0
  51.     move.l    d6,d0
  52.     _SetHandleSize
  53.     tst.w    d0
  54.     bne.s    SwapThreadOutOfMemory
  55.     move.l    gFromStackH(A5), a4
  56.     move.l    (a4), a4
  57.     move.l    d6, kAllocSize(a4)
  58. NoGrowNeeded
  59.     move.l    d7, kSize(a4)                ; save stack size
  60.     move.l    d5, kStartAddr(a4)            ; save stack start
  61.     move.l    a7, kSP(a4)                    ; save SP
  62.     move.l    d7,d0
  63.     move.l    a4, a1
  64.     add.l    #kDataOffset, a1
  65.     move.l    d5,a0
  66.     _BlockMove
  67.     
  68. ; restore new stack
  69. MySwapStacks_SwapIn
  70.     tst.l    gToStackH(A5)
  71.     beq.s    MySwapStacks_Done            ; skip if no dest handle
  72.     move.l    gToStackH(A5), a4
  73.     move.l    (a4), a4
  74.     move.l    kSP(a4), a7
  75.     sub.l    #256, a7                    ; keep rts addr safe
  76.     move.l    kStartAddr(a4), a1
  77.     move.l    a4, a0
  78.     add.l    #kDataOffset, a0
  79.     move.l    kSize(a4), d0
  80.     _BlockMove
  81.     add.l    #256, a7                    ; reset a7 to real value
  82.  
  83. MySwapStacks_Done
  84.     movem.l    (a7)+, d0-d7/a0-a6
  85.     rts
  86. ; for MacsBug
  87. ;    unlk    a6
  88. ;    rts
  89.     string AsIs
  90.     dc.b    $8C
  91.     dc.b    'MySwapStacks'
  92.     dc.w    0
  93.  
  94. SwapThreadOutOfMemory
  95.     pea        #'Could not resize handle for saving stack (swapping thread out)'
  96.     jsr        (PanicExitToShell__FPCc).L        ; (does not return)
  97.     _Debugger
  98.     rts
  99.     dc.b    $95
  100.     dc.b    'SwapThreadOutOfMemory'
  101.     dc.w    0
  102. ENDP
  103.  
  104.  
  105. ; Copied from {AIncludes}SysEqu.a
  106. HeapEnd            EQU     $114  ;[GLOBAL VAR] Address of end of application heap zone
  107.                    ;        end of heap [pointer]
  108. ApplLimit          EQU     $130  ;[GLOBAL VAR] Application heap limit
  109.                    ;        application limit [pointer]
  110. HiHeapMark         EQU     $BAE  ;[GLOBAL VAR]  (long) highest address used by a zone below sp<01Nov85 JTC>
  111.  
  112. MySetJmp68000 PROC    EXPORT
  113. ; showup for MacsBug
  114.     link    a6, #0
  115.     unlk    a6
  116.     movea.l    (a7)+, a1
  117.     movea.l    (a7),a0
  118.     movem.l    d2-d7/a1-a4/a6/a7, (a0)
  119.     move.l    $114,$30(a0)                ;HeapEnd
  120.     move.l    $130,$34(a0)                ;ApplLimit
  121.     move.l    $BAE,$38(a0)                ;HiHeapMark
  122.     moveq    #0, d0
  123.     jmp        (a1)
  124. ; for MacsBug
  125.     rts
  126.     string AsIs
  127.     dc.b    $8D
  128.     dc.b    'MySetJmp68000'
  129.     dc.w    0
  130. ENDP
  131.  
  132. MyLongJmp68000 PROC    EXPORT
  133.     Import    PanicExitToShell__FPCc:Code
  134. ; showup for MacsBug
  135.     link    a6, #0
  136.     unlk    a6
  137.     move.l    8(a7),d0                    ; Ptr to dispose
  138.     move.l    4(a7),a0
  139.     movem.l    (a0), d2-d7/a1-a4/a6/a7
  140.     move.l    $30(a0),$114                ; HeapEnd
  141.     move.l    $34(a0),$130                ; ApplLimit
  142.     move.l    $38(a0),$BAE                ; HiHeapMark
  143.     movea.l    d0,a0
  144.     move.l    d0,d1 ; say after me: addr moves doesn't set flags
  145.     beq.s    NoDispose
  146.     _DisposePtr
  147.     tst.w    $220                        ; MemError()
  148.     bne.s    BadDispose
  149. NoDispose
  150.     moveq    #1, d0
  151.     jmp        (a1)
  152. ; for MacsBug
  153.     rts
  154.     string AsIs
  155.     dc.b    $8E
  156.     dc.b    'MyLongJmp68000'
  157.     dc.w    0
  158. BadDispose
  159.     pea        #'MemError after _Dispose of thread stack'
  160.     jsr        (PanicExitToShell__FPCc).L        ; (does not return)
  161.     _Debugger
  162.     rts
  163.     dc.b    $95
  164.     dc.b    'SwapThreadOutOfMemory'
  165.     dc.w    0
  166. ENDP
  167.  
  168.  
  169. ;    Include 'Socket.a'
  170.                 END
  171.  
  172. asm -model far UThread.a ∑ {worksheet}
  173. dumpobj UThread.a.o ∑∑ {worksheet}
  174. link -m MySwapStacks UThread.a.o -o UThread.a.o.link
  175. dumpcode UThread.a.o.link
  176. #
  177.